package com.changgou.order.service.impl;

import com.changgou.goods.feign.SkuFeign;
import com.changgou.goods.feign.SpuFeign;
import com.changgou.goods.pojo.Sku;
import com.changgou.goods.pojo.Spu;
import com.changgou.order.pojo.OrderItem;
import com.changgou.order.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author: wzw
 * @Description 商品加入购物车实现类
 * @Date: 2020/12/23 22:00
 * @version: 1.8
 */
@Service
public class CartServiceImpl implements CartService {
    //注入sku的feign
    @Autowired(required=true)
    private SkuFeign skuFeign;

    //注入spu的feign
    @Autowired(required=true)
    private SpuFeign spuFeign;

    //注入redis模板
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * @author wzw
     * 商品加入购物车
     * @Date 23:51 2020/12/23
     * @param sku_id 库存id
     * @param num 购买数量
     * @param username 当前用户
     * @return void
    **/
    @Override
    public void add(Long sku_id, Integer num, String username) {
        //1.获取数据
        //根据id获取sku数据
        Sku sku = skuFeign.findById(sku_id).getData();
        //根据sku中的spu的id获取spu
        Spu spu = spuFeign.findById(sku.getSpuId()).getData();

        // 2.将商品信息存储到购物车对象中(订单详情pojo)
        OrderItem orderItem = goods2OrderItem(sku, spu, num);
        
        //3.自定义方法:判断在Redis数据库中是否有同样数据
        orderItem = getOrderItem(sku_id, num, username, orderItem);
        
        // 3.将购物车保存到redis中
        redisTemplate.boundHashOps("cart_"+username).put(sku_id,orderItem);
        

    }

    /**
     * @author wzw
     * 读取用户购物车列表
     * @Date 15:21 2020/12/24
     * @param username 账号
     * @return java.util.List<com.changgou.order.pojo.OrderItem>
    **/
    @Override
    public List<OrderItem> list(String username) {
        //获取key为"cart_" + username的value值
        List<OrderItem> values = redisTemplate.boundHashOps("cart_" + username).values();
        //返回值
        return values;
    }

    /**
     * @author wzw
     * 查询Redis中是否有同款商品
     * @Date 23:49 2020/12/23
     * @param id 库存的id
     * @param num 增加的数量
     * @param username 用户账号 
     * @param orderItem 判断的对象
     * @return com.changgou.order.pojo.OrderItem
    **/
    private OrderItem getOrderItem(Long id, Integer num, String username, OrderItem orderItem) {
        //查询Redis中是否有同款商品
        Boolean isExist = redisTemplate.boundHashOps("cart_" + username).hasKey(id);
        //判断是否有同款商品(有同款:合并数量)
        if (isExist) {
            //从Redis中获取数据
            orderItem = (OrderItem) redisTemplate.boundHashOps("cart_" + username).get(id);
            //修改数量(原值+增加数量)
            orderItem.setNum(orderItem.getNum() + num);

        }
        return orderItem;
    }

    /**
     * @author wzw
     * 将商品信息封装到购物车对象中
     * @Date 22:11 2020/12/23
     * @param sku 商品对象
     * @param spu 库存对象
     * @param num 数量
     * @return com.changgou.order.pojo.OrderItem
    **/
    private OrderItem goods2OrderItem(Sku sku, Spu spu, Integer num) {
        // new订单详情pojo对象
        OrderItem orderItem = new OrderItem();
        //填充购物车对象的数据(对应订单详细)
        orderItem.setCategoryId1(spu.getCategory1Id());//一级分类
        orderItem.setCategoryId2(spu.getCategory2Id());//二级分类
        orderItem.setCategoryId3(spu.getCategory3Id());//三级分类

        orderItem.setSpuId(spu.getId());			//spu_id
        orderItem.setSkuId(sku.getId());			//sku_id
        orderItem.setName(sku.getName());           // 商品名称
        orderItem.setPrice(sku.getPrice());         // 商品单价
        orderItem.setNum(num);                      // 购买数量
        orderItem.setMoney(sku.getPrice() * num);   // 总金额
        orderItem.setPayMoney(sku.getPrice() * num);// 实付金额 = 总金额 - 优惠券 - e卡等
        orderItem.setImage(sku.getImage());         // 商品图片
        orderItem.setWeight(sku.getWeight());       // 商品重量
        orderItem.setPostFee(9);                    // 商品运费 = 总金额判断是否超过 99   金牌会员
        orderItem.setIsReturn("0");                 // 商品的退货状态
        
        return orderItem;
    }
}
